<?php
class Demo1
{
    public $name = 'PHP中文网';
    public function getName()
    {
        return $this->name;
    }
    public function getObj()

    {
        return new self();
    }
    public function getStatic()
    {
        return new static();
    }
}

class Demo2 extends Demo1
{
    public function getNewObj()

    {
        return new parent();
    }
}
//1.用new 类名（）来创建一个对象
$obj = new Demo1();//如果不需要传入参数的话，可以省去括号（）
echo $obj->name;
echo '<hr>';

//2,将类名，以字符串的方式放在一个变量中
$className = 'Demo1';
$obj1 = new $className;
echo $obj1->name;
echo '<hr>';

//3，用对象来创建对象，并且它创建的是一个新对象
$obj2 = new $obj();//注意：$obj2 = $obj 不同的
//echo get_class($obj2);//查是那个类创建的
echo $obj2->name;
echo '<hr>';

//4，用 new self()
$obj3 = $obj->getObj();
//echo get_class($obj3);//查是那个类创建的
echo $obj3->name;
echo '<hr>';

//5，用new parent()来创建一个对象
$obj4 = (new Demo2)->getNewObj();
//echo get_class($obj4);
echo $obj4->name;
echo '<hr>';

//6，基于当前调用的类来创建：new static
$obj5 = (new Demo1)->getStatic();
$obj6 = (new Demo1)->getObj();
//echo get_class($obj5);
//echo get_class($obj6);//在子类创建的就有区别了，如下
echo '<hr>';

$obj7 = (new Demo2)->getStatic();
$obj8 = (new Demo2)->getObj();
//echo get_class($obj7);//new static() 创建的
//new static 创建的对象，直接与调用者绑定，静态延迟绑定
//echo get_class($obj8);//new self() 创建的
